*/
int current_state;
+ int err;
+
+ if (state == dev->state)
+ return 0;
- int err = xenbus_scanf(xbt, dev->nodename, "state", "%d",
+ err = xenbus_scanf(xbt, dev->nodename, "state", "%d",
¤t_state);
- if ((err == 1 && (XenbusState)current_state == state) ||
- err == -ENOENT)
+ if (err != 1)
return 0;
err = xenbus_printf(xbt, dev->nodename, "state", "%d", state);
if (err) {
- xenbus_dev_fatal(dev, err, "writing new state");
+ if (state != XenbusStateClosing) /* Avoid looping */
+ xenbus_dev_fatal(dev, err, "writing new state");
return err;
}
+
+ dev->state = state;
+
return 0;
}
EXPORT_SYMBOL(xenbus_switch_state);
ret = vsnprintf(printf_buffer+len, PRINTF_BUFFER_SIZE-len, fmt, ap);
BUG_ON(len + ret > PRINTF_BUFFER_SIZE-1);
- dev->has_error = 1;
dev_err(&dev->dev, "%s\n", printf_buffer);
{
struct xenbus_device *xendev = to_xenbus_device(dev);
int *result = data;
- int state;
- int err = xenbus_scanf(XBT_NULL, xendev->nodename, "state", "%d",
- &state);
- if (err != 1 || state != XenbusStateConnected) {
+ if (xendev->state != XenbusStateConnected) {
result = 0;
return 1;
}
- return 1;
+ return 0;
}